#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
群组管理控制器（合并版本）
将路由和控制器合并到一个类中
"""

from flask import Blueprint, request, current_app
from services.app_service import AppService
from services.group_service import GroupService
from utils.R import R
from settings import get_logger

# API版本
API_VERSION = 'v1'

# 创建蓝图，设置URL前缀
group_bp = Blueprint('group', __name__, url_prefix=f'/api/{API_VERSION}/group')

class GroupController:
    """
    群组管理控制器
    负责处理群组相关的HTTP请求和响应
    """
    
    def __init__(self):
        """
        初始化控制器并注册路由
        """
        self.app_service = AppService()
        self.group_service = GroupService()
        self.logger = get_logger(__name__)
        self._register_routes()
    
    def _register_routes(self):
        """
        注册所有路由
        """
        # 注册路由装饰器，路由前缀已在蓝图中设置，这里只需要指定具体路径
        group_bp.route('', methods=['GET'])(self.get_groups)
        group_bp.route('/<group_id>', methods=['GET'])(self.get_group_by_id)
        group_bp.route('/<group_id>', methods=['PUT'])(self.update_group)
        group_bp.route('/<group_id>', methods=['DELETE'])(self.delete_group)
        group_bp.route('/members/<group_id>', methods=['GET'])(self.get_group_members)
        group_bp.route('/sync', methods=['POST'])(self.sync_groups)
        group_bp.route('/sync/status/<task_id>', methods=['GET'])(self.get_sync_status)
    
    def get_groups(self):
        """
        获取群聊列表
        
        GET /api/v1/group
        
        请求参数:
            account: 微信账号
            sync: 是否同步微信群聊信息 (可选，默认为false)
            page: 页码，从1开始 (可选，如果提供则启用分页)
            per_page: 每页记录数，1-100之间 (可选，默认为20)
        
        返回:
            群聊列表
        """
        try:
            self.logger.info(f"接收到获取群聊列表请求: {request.args}")
            # 从请求中提取参数
            account = request.args.get('account')
            sync = request.args.get('sync', 'false').lower() == 'true'
            
            # 提取分页参数
            page = request.args.get('page')
            per_page = request.args.get('per_page')
            
            self.logger.debug(f"解析请求参数: account={account}, sync={sync}, page={page}, per_page={per_page}")
            
            # 转换分页参数为整数
            if page is not None:
                try:
                    page = int(page)
                except ValueError:
                    self.logger.warning(f"页码参数无效: {page}")
                    return R.fail(message="页码参数必须是整数")
                
                if page < 1:
                    self.logger.warning(f"页码参数无效: {page}")
                    return R.fail(message="页码必须大于等于1")
            
            if per_page is not None:
                try:
                    per_page = int(per_page)
                except ValueError:
                    self.logger.warning(f"每页记录数参数无效: {per_page}")
                    return R.fail(message="每页记录数参数必须是整数")
                
                if per_page < 1 or per_page > 100:
                    self.logger.warning(f"每页记录数参数无效: {per_page}")
                    return R.fail(message="每页记录数必须在1-100之间")
            
            # 获取应用实例
            app = self.app_service.get_app()
            if not app:
                self.logger.error("应用未初始化")
                return R.fail(message="应用未初始化")
            
            # 调用服务层获取群聊列表
            result = self.group_service.get_groups(
                app=app,
                account=account,
                sync=sync,
                page=page,
                per_page=per_page
            )
            
            self.logger.info(f"获取群聊列表成功，返回结果类型: {type(result)}")
            return result
            
        except Exception as e:
            import traceback
            error_trace = traceback.format_exc()
            self.logger.error(f"获取群聊列表失败: {e}\n{error_trace}")
            return R.fail(message=f"获取群聊列表失败: {str(e)}")

    def get_group_by_id(self, group_id):
        """
        根据ID获取群聊信息
        
        GET /api/v1/group/<group_id>
        
        路径参数:
            group_id: 群组ID
        
        返回:
            群聊详细信息
        """
        try:
            # 获取应用实例
            app = self.app_service.get_app()
            if not app:
                self.logger.error("应用未初始化")
                return R.fail(message="应用未初始化")
            
            # 调用服务层获取群聊信息
            result = self.group_service.get_group_by_id(app, group_id)
            return result
            
        except Exception as e:
            self.logger.error(f"获取群聊信息失败: {e}")
            return R.fail(message="获取群聊信息失败")

    def update_group(self, group_id):
        """
        更新群聊信息
        
        PUT /api/v1/group/<group_id>
        
        路径参数:
            group_id: 群组ID
        
        请求体:
            group_name: 群聊名称 (可选)
            member_count: 群成员数量 (可选)
            auto_reply_enabled: 是否启用自动回复 (可选)
            reply_at_only: 是否只回复@消息 (可选)
            custom_reply_message: 自定义自动回复消息 (可选)
            welcome_enabled: 是否启用新成员欢迎 (可选)
            welcome_message_template: 欢迎消息模板 (可选)
            news_push_enabled: 是否启用新闻推送 (可选)
            news_push_time: 新闻推送时间 (可选)
            is_active: 是否活跃群聊 (可选)
            description: 群聊描述 (可选)
        
        返回:
            更新后的群聊信息
        """
        try:
            # 获取请求数据
            data = request.get_json() or {}
            
            # 获取应用实例
            app = self.app_service.get_app()
            if not app:
                self.logger.error("应用未初始化")
                return R.fail(message="应用未初始化")
            
            # 调用服务层更新群聊信息
            result = self.group_service.update_group(app, group_id, data)
            return result
            
        except Exception as e:
            self.logger.error(f"更新群聊信息失败: {e}")
            return R.fail(message="更新群聊信息失败")

    def delete_group(self, group_id):
        """
        删除群聊信息
        
        DELETE /api/v1/group/<group_id>
        
        路径参数:
            group_id: 群组ID
        
        返回:
            操作结果
        """
        try:
            # 获取应用实例
            app = self.app_service.get_app()
            if not app:
                self.logger.error("应用未初始化")
                return R.fail(message="应用未初始化")
            
            # 调用服务层删除群聊信息
            result = self.group_service.delete_group(app, group_id)
            return result
            
        except Exception as e:
            self.logger.error(f"删除群聊信息失败: {e}")
            return R.fail(message="删除群聊信息失败")
    
    def get_group_members(self, group_id):
        """
        获取群成员列表
        
        GET /api/v1/group/members/<group_id>
        
        路径参数:
            group_id: 群组ID
        
        返回:
            群成员列表
        """
        try:
            # 获取应用实例
            app = self.app_service.get_app()
            if not app:
                self.logger.error("应用未初始化")
                return R.fail(message="应用未初始化")
            
            # 调用服务层获取群成员列表
            result = self.group_service.get_group_members(app, group_id)
            return result
            
        except Exception as e:
            self.logger.error(f"获取群成员列表失败: {e}")
            return R.fail(message="获取群成员列表失败")
    
    def sync_groups(self):
        """
        同步群聊信息
        
        POST /api/v1/group/sync
        
        请求体:
            account: 微信账号 (可选)
        
        返回:
            同步任务ID
        """
        try:
            # 获取请求数据
            data = request.get_json() or {}
            account = data.get('account')
            
            # 获取应用实例
            app = self.app_service.get_app()
            if not app:
                self.logger.error("应用未初始化")
                return R.fail(message="应用未初始化")
            
            # 调用服务层同步群聊信息
            result = self.group_service.sync_groups(app, account)
            return result
            
        except Exception as e:
            self.logger.error(f"同步群聊信息失败: {e}")
            return R.fail(message="同步群聊信息失败")
    
    def get_sync_status(self, task_id):
        """
        获取同步任务状态
        
        GET /api/v1/group/sync/status/<task_id>
        
        路径参数:
            task_id: 同步任务ID
        
        返回:
            同步任务状态
        """
        try:
            # 获取应用实例
            app = self.app_service.get_app()
            if not app:
                self.logger.error("应用未初始化")
                return R.fail(message="应用未初始化")
            
            # 调用服务层获取同步任务状态
            result = self.group_service.get_sync_status(app, task_id)
            return result
            
        except Exception as e:
            self.logger.error(f"获取同步任务状态失败: {e}")
            return R.fail(message="获取同步任务状态失败")

# 实例化控制器，确保路由被注册
group_controller = GroupController()